<?php

/*
 * 获取文件后缀名
 * 如传入abc.jpg,返回jpg
 */
if ( ! function_exists('get_extension'))
{
	function get_extension($filename)
	{
		$a = explode('.', $filename);
		return end($a);
	}
}

/*
 * 写入文件
 * 成功返回写入的字节长度，失败返回false
 */
if ( ! function_exists('write_file'))
{
	function write_file($filename, $content)
	{
		//打开文件失败返回false
		if(FALSE == ($fp = @fopen($filename, 'wb')))
		{
			return FALSE;
		}
		
		//独占锁定
		flock($fp, LOCK_EX);
		
		//写入文件失败返回false
		if ( ! fwrite($fp, $content))
		{
			return FALSE;
		}
		
		//释放锁定
		flock($fp, LOCK_UN);
		
		fclose($fp);
		
		return filesize($filename);;
	}
}

/*
 * 读取文件
 * 读取成功返回文件内容，失败返回false
 */
if ( ! function_exists('read_file'))
{
	function read_file($filename)
	{
		//文件不存在或不可读，直接返回false
		if ( ! is_file($filename) || ! is_readable($filename))
		{
			return FALSE;
		}
		
		//如果存在file_get_contents，使用它读取
		if(function_exists('file_get_contents'))
		{
			return file_get_contents($filename);
		}
		
		//打开文件失败，返回false
		if(FALSE == ($fp = fopen($filename, 'rb')))
		{
			return FALSE;
		}
		
		//共享锁定
		flock($fp, LOCK_SH);
		
		$content = '';
		
		if(filesize($filename)>0)
		{
			$content = fread($fp, filesize($filename));
		}
		
		//释放锁定
		flock($fp, LOCK_UN);
		
		fclose($fp);
		
		return $content;
	}
}

/*
 * 删除文件
 * 删除成功返回true,失败返回false
 */
if ( ! function_exists('delete_file'))
{
	function delete_file($filename)
	{
		//文件不存在或不是文件直接返回true
		if ( ! is_file($filename))
		{
			return TRUE;
		}
		//删除文件失败返回false
		if ( ! unlink($filename))
		{
			return FALSE;
		}
		
		return TRUE;
	}
}

/*
 * 移动文件
 * source	源文件地址
 * target	要移动到的地址
 * cover	是否覆盖
 * 成功返回true,失败返回false。（移动后旧的文件就不见了，到新的地址）
 */
if ( ! function_exists('move_file'))
{
	function move_file($source, $target, $cover = FALSE)
	{
		//源文件不存在或不是文件，直接返回false
		if ( ! is_file($source))
		{
			return FALSE;
		}
		
		$target_path = dirname($target);
		//要移动到的目录不存在或不可写入，返回false
		if ( ! is_dir($target_path) || ! is_writable($target_path))
		{
			return FALSE;
		}
		
		//要移动到的文件已经存在，判断是否覆盖，不覆盖的话删除源文件返回true
		if (is_file($target) && $cover==FALSE)
		{
			unlink($source);
			return TRUE;
		}
		
		if ( ! rename($source, $target))
		{
			return FALSE;
		}
		
		return TRUE;
	}
}

/*
 * 递归创建目录
 * 生成成功返回true,失败返回false
 */
if ( ! function_exists('create_dir'))
{
	function create_dir($pathname, $mode = 0777)
	{
		if (is_dir($pathname))
		{
			return TRUE;
		}
		//php5提供了第三个参数递归生成目录
		return mkdir($pathname, $mode, TRUE);
		
		//下面的递归生成
		if (is_dir($pathname) || mkdir($pathname, $mode))
		{
			return TRUE;
		}
		return create_dir(dirname($pathname)) && mkdir($pathname);
	}
}

/*
 * 删除文件夹及内容
 * 成功返回true,失败返回false
 */
if ( ! function_exists('delete_dir'))
{
	function delete_dir($path)
	{
		//目录不存在或不是目录，直接返回true
		if ( ! is_dir($path))
		{
			return TRUE;
		}
		//将path转换为绝对路径
		$path = rtrim(str_replace('\\', '/', realpath($path)), '/').'/';
		
		//打开目录失败返回false
		if (FALSE == ($handle = opendir($path)))
		{
			return FALSE;
		}
		
		//循环删除目录下的目录和文件
		while (FALSE !== ($file = readdir($handle)))
		{
			if ($file!='.' && $file!='..')
			{
				if (is_dir($path.$file))
				{
					if ( ! delete_dir($path.$file))
					{
						closedir($handle);
						return FALSE;
					}
				}
				elseif ( ! unlink($path.$file))
				{
					return FALSE;
				}
			}
		}
		
		closedir($handle);

		if ( ! rmdir($path))
		{
			return FALSE;
		}
		return TRUE;
	}
}

/*
 * 清空文件夹内容
 * 成功返回true,失败返回false
 */
if ( ! function_exists('clean_dir'))
{
	function clean_dir($path)
	{
		//目录栏不存在或不是目录，直接返回true
		if ( ! is_dir($path))
		{
			return TRUE;
		}

		//将path转换为绝对路径
		$path = rtrim(str_replace('\\', '/', realpath($path)), '/').'/';
		
		//打开目录失败返回false
		if (FALSE==($handle = opendir($path)))
		{
			return FALSE;
		}
		
		//循环删除目录下的目录与文件
		while (FALSE !== ($file = readdir($handle)))
		{
			if ($file!='.' && $file!='..')
			{	
				if (is_dir($path.$file))
				{
					if ( ! delete_dir($path.$file))
					{
						closedir($handle);
						return FALSE;
					}
				}
				elseif ( ! unlink($path.$file))
				{
					return FALSE;
				}
			}
		}
		
		closedir($handle);

		return TRUE;
	}
}

/*
 * 读目录
 * 参数：
 * path => 目录路径
 * order_by => 文件排序规则，可选name,size,time,type
 * order_way => 排序方式，可选asc,desc
 * 成功返回目录详情，失败返回false
 * 返回结果数组，单个目录详情如下：
 * name => 文件或目录名称
 * path => 文件或目录路径，据对路径
 * type => 文件或目录修改时间，10为数字格式
 * size => 文件类型，即后缀名
 * is_dir => 是否目录
 * is_empty => 目录是否为空
 * is_image => 是否图片
 */
if ( ! function_exists('read_dir'))
{
	function read_dir($path, $order_by = 'name', $order_way = 'asc')
	{
		if ( ! is_dir($path))
		{
			return FALSE;
		}
		
		$order_by = in_array($order_by, array('name', 'size', 'time', 'type')) ? $order_by : 'name';
		$order_way = in_array($order_way, array('asc', 'desc')) ? $order_way : 'asc';

		//将path转换为绝对路径
		$path = rtrim(str_replace('\\', '/', realpath($path)), '/').'/';
		
		//打开目录失败返回false
		if (FALSE==($handle = opendir($path)))
		{
			return FALSE;
		}
		
		//将信息存起来供usort用
		$config = array(
			'order_by' => $order_by,
			'order_way' => $order_way
		);
		
		//保存order_by,order_way给usort用
		function dir_config($config = array())
		{
			static $_config = array();
			if ($config)
			{
				$_config = $config;
			}
			else
			{
				return $_config;
			}
		}
	
		dir_config($config);
		
		//要返回的信息数组
		$list = array();
		
		$i = 1;
		
		//循环删除目录下的目录与文件
		while (FALSE !== ($file = readdir($handle)))
		{
			if ($file!='.' && $file!='..')
			{
				$list[$i]['name'] = $file;
				$list[$i]['path'] = $path.$file;
				$list[$i]['time'] = filemtime($path.$file);
				
				//是不是目录
				if (is_dir($path.$file))
				{
					$list[$i]['is_dir'] = TRUE;
					$list[$i]['is_empty'] = (count(scandir($path.$file)) > 2) ? FALSE : TRUE;
					$list[$i]['type'] = '';
					$list[$i]['is_image'] = FALSE;
					$list[$i]['size'] = 0;
				}
				else
				{
					$list[$i]['is_dir'] = FALSE;
					$list[$i]['is_empty'] = TRUE;
					$list[$i]['type'] = get_extension($file);
					$list[$i]['is_image'] = in_array($list[$i]['type'], array('jpg', 'png', 'gif', 'jpeg'));
					$list[$i]['size'] = filesize($path.$file);
				}
				$i++;
			}
		}
		
		if ($list)
		{
			function user_sort($a, $b)
			{
				$config = dir_config();
				$order_by = $config['order_by'];
				$order_way = $config['order_way'];

				if ($a['is_dir'] && !$b['is_dir'])
				{
					return -1;
				}
				elseif (!$a['is_dir'] && $b['is_dir'])
				{
					return 1;
				}
				else
				{
					switch ($order_by)
					{
						case 'size':
							return ($a['size']>$b['size']) ? (($order_way == 'asc') ? 1 : -1) : (($a['size']<$b['size']) ? (($order_way == 'asc') ? -1 : 1) : 0);
							break;
						case 'type':
							return ($order_way == 'asc') ? strcmp($a['type'], $b['type']) : strcmp($b['type'], $a['type']);
							break;
						case 'name':
							return ($order_way == 'asc') ? strcmp($a['name'], $b['name']) : strcmp($b['name'], $a['name']);
							break;
						case 'time':
							return ($a['time']>$b['time']) ? (($order_way == 'asc') ? 1 : -1) : (($a['time']<$b['time']) ? (($order_way == 'asc') ? -1 : 1) : 0);
							break;
						default:
							return 0;
							break;
					}
				}
			}
			
			usort($list, 'user_sort');
		}
		
		closedir($handle);
		
		return $list;
	}	
}